a) Aufgabe
Wir möchten ein Wörterbuch 'Deutsch-Englisch' für Fachbegriffe der Informatik erstellen. Das folgende Bild zeigt die Benutzerschnittstelle. Auf dem Tabellenblatt gibt man Begriffspaare ein und fügt sie durch Klicken der ersten Schaltfläche einer Datenstruktur des Internspeichers hinzu. Über die zweite Schaltfläche kann man sich die englische Übersetzung eines deutschen Begriffes ausgeben lassen. Schliesslich lässt sich ein bestimmtes Begriffspaar auch wieder aus dem Wörterbuch entfernen.
Das Projekt gleicht dem Telefonverzeichnis-Projekt. Anstelle der Namen und Telefonnummern treten deutsche und englische Begriffe. Die Klasse für das Verzeichnis möchten wir diesmal jedoch selber mit Hilfe eines Binärbaumes programmieren, um die Mechanismen hinter der Verwaltung grosser Datenmengen kennenzulernen. Wir werden sehen, dass die Suche in einem sortierten Binärbaum beinahe so schnell ist wie die binäre Suche in einem Datenfeld, dass aber die verkettete Struktur das Einfügen und Entfernen von Elementen erleichtert.
b) Entwurf des Objektmodells
Das nächste Bild skizziert die Module und Objekte der Anwendung. Den Kern der Implementation bildet die selbst entwickelte Auflistung cWörterbuch, die im wesentlichen die Aufgabe der Collection-Klasse im Telefonverzeichnis-Projekt übernimmt. Ihre fügeHinzu-Methode füllt neue Begriffspaare in alphabetischer Sortierung in einen Binärbaum ein.
Die Module erfüllen die folgenden Funktionen:
Das Modul Prozeduren enthält die Ereignisprozeduren für die Klick-Ereignisse der Schaltflächen. Das Tabellenblattmodul mit den Steuerelementen ist nicht explizit dargestellt.
Das Klassenmodul cEintrag beschreibt die Objekte, welche die Begriffspaare in den Eigenschaften Begriff und Definition speichern. Durch Verketten dieser Objekte entsteht der Binärbaum.
Das Klassenmodul cWörterbuch beschreibt ein Objekt zur Verwaltung von cEintrag-Objekten. Die folgende Tabelle listet seine Methoden auf und nennt als Vergleich die entsprechenden Methoden der Collection-Klasse.
|
cWörterbuch |
Beschreibung |
|
fügeHinzu Begriff, Definition |
Die Subroutine fügt das übergebene Begriffspaar, sortiert nach dem ersten Argument ins Wörterbuch ein |
|
Eintrag Begriff |
Die Funktion gibt das Objekt zurück, das die Definition des angegebenen Begriffs enthält, bzw. Nothing, falls der Begriff nicht definiert ist |
|
entferne Begriff |
Die Subroutine entfernt das Objekt, das den angegebenen Begriff definiert |
|
OErster() und |
Die beiden Fuktionen werden zum sequentiellen Durchblättern des Wörterbuchs benötigt. Beide geben ein Objekt des Typs cEintrag oder Nothing zurück |
Die Klasse cWörterbuch unterscheidet sich von der Collection-Klasse vor allem darin, dass sie Objekte automatisch sortiert. Allerdings kann sie im Gegensatz zur Collection nur Objekte vom Typ cEintrag verwalten, und der Zugriff auf die Objekte ist nur über den Begriff (Schlüssel) möglich, während die Collection jedem Eintrag auch einen eindeutigen Index zuweist. Schliesslich ist es in VBA nicht möglich, die Klasse so zu implementieren, dass die verwalteten Objekte mit einer For Each ... Next-Schleife durchlaufen werden können. Als Alternative bietet die Wörterbuchklasse die Methoden OErster und ONächster an. Das 'O' steht für 'Ordnungsnachfolger'. Den Benutzern erscheint cWörterbuch damit als geordnete Liste, wie die Collection-Klasse auch. Die folgende Testprozedur illustriert das Arbeiten mit einem cWörterbuch-Objekt. Das nächste Bild zeigt die Ausgabe des Programms.
Sub Test()
Dim BuchDeEn As cWörterbuch
Dim Eintrag As cEintrag
'--- 1 Erstelle ein Wörterbuch-Objekt
Set BuchDeEn = New cWörterbuch
'--- 2 Trage drei Begriffe ein
BuchDeEn.FügeHinzu "baum", "tree"
BuchDeEn.FügeHinzu "ast", "branch"
BuchDeEn.FügeHinzu "kind", "child"
'--- 3 Durchlaufe alle Elemente und gib sie aus
Set Eintrag = BuchDeEn.OErster()
Do While Not Eintrag Is Nothing
MsgBox Eintrag.Begriff & ":=" & Eintrag.Definition
Set Eintrag = BuchDeEn.ONächster(Eintrag)
Loop
End Sub
Das Programm erstellt ein Wörterbuch und fügt ihm drei Einträge hinzu. Die Funktion OErster gibt das erste Objekt, mit dem Begriff 'ast' zurück. In der Schleife wird dieses Objekt der Funktion ONächster übergeben, damit das Wörterbuch 'weiss', wessen Nachfolger es zurückgeben soll. Der Rückgabewert ist das Objekt mit dem Begriff 'baum'. Wird der Funktion ONächster das letzte Objekt ('kind') übergeben, so gibt sie Nothing zurück, da dieses Objekt keinen Nachfolger hat, und die Schleife bricht ab.
c) Implementation
Ein Wörterbuch-Objekt erscheint den Benutzern als Liste. Tatsächlich verwaltet es die Eintrag-Objekte aber intern in einer Binärbaumstruktur. Die Vorteile wurden in der Einleitung bereits angedeutet. Die Themen sortierter Binärbaum, ausbalancierter Binärbaum, verkettete Datenstrukturen und rekursive Algorithmen implementieren die Baumstruktur und die zugehörigen Algorithmen und diskutieren die Stärken und Schwächen gegenüber anderen Datenstrukturen eingehender.